package com.ly.framework.web.service;

import com.ly.common.core.domain.entity.SysUser;
import com.ly.common.core.domain.model.LoginUser;
import com.ly.common.enums.UserStatus;
import com.ly.common.exception.BaseException;
import com.ly.common.utils.StringUtils;
import com.ly.system.service.ISysPostService;
import com.ly.system.service.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 用户验证处理
 * @author ruoyi
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private static final Logger log = LoggerFactory.getLogger ( UserDetailsServiceImpl.class );

    @Resource
    private ISysUserService iSysUserService;

    @Resource
    private SysPermissionService sysPermissionService;

    @Resource
    private ISysPostService iSysPostService;

    @Override
    public UserDetails loadUserByUsername (String username) throws UsernameNotFoundException {
        SysUser user = iSysUserService.selectUserByUserName ( username );
        if ( StringUtils.isNull ( user ) ) {
            log.info ( "登录用户：{} 不存在.", username );
            throw new UsernameNotFoundException ( "登录用户：" + username + " 不存在" );
        } else if ( UserStatus.DELETED.getCode ().equals ( user.getDelFlag () ) ) {
            log.info ( "登录用户：{} 已被删除.", username );
            throw new BaseException ( "对不起，您的账号：" + username + " 已被删除" );
        } else if ( UserStatus.DISABLE.getCode ().equals ( user.getStatus () ) ) {
            log.info ( "登录用户：{} 已被停用.", username );
            throw new BaseException ( "对不起，您的账号：" + username + " 已停用" );
        }

        return createLoginUser ( user );
    }

    public UserDetails createLoginUser (SysUser user) {
        Set<String> postCode = iSysPostService.selectPostCodeByUserId ( user.getUserId () );
        postCode = postCode.parallelStream ().map ( s -> "GROUP_" + s ).collect ( Collectors.toSet () );
        postCode.add ( "ROLE_ACTIVITI_USER" );
        List<SimpleGrantedAuthority> collect = postCode.stream ().map ( s -> new SimpleGrantedAuthority ( s ) ).collect ( Collectors.toList () );
        return new LoginUser ( user, sysPermissionService.getMenuPermission ( user ), collect );
    }
}
